package com.idanchuang.component.provider.api.util;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.idanchuang.component.core.helper.EnvContext;

import java.util.HashMap;
import java.util.Map;

/**
 *
 * RPC请求链变量表, 在这里存储的本地变量会被传递至下游服务
 *
 * @author yjy
 * @date 2019/12/6 9:12
 * @since 0.1.1-RELEASE
 * @deprecated use {@link EnvContext} instead
 **/
@Deprecated
public class RpcThreadLocalUtil {

    /**
     * 变量表
     */
    private static final ThreadLocal<Map<String, String>> LOCAL = new TransmittableThreadLocal<>();

    /**
     * 存入一个值
     * @param key 名
     * @param value 值
     */
    public static void addToThreadLocal(String key, String value) {
        Map<String, String> map = getAll();
        map.put(key, value);
        update(map);
    }

    /**
     * 存入一个值的集合
     * @param datas 值集合
     */
    public static void addToThreadLocal(Map<String, String> datas) {
        Map<String, String> map = getAll();
        map.putAll(datas);
        update(map);
    }

    /**
     * 从变量表中取出一个值
     * @param key 名
     * @return 值
     */
    public static String getFromThreadLocal(String key) {
        Map<String, String> map = getAll();
        return map.get(key);
    }

    /**
     * 从变量表中取出一个值, 不存在时返回默认值
     * @param key 名
     * @param defaultValue 默认值
     * @return 值或默认值
     */
    public static String getFromThreadLocal(String key, String defaultValue) {
        Map<String, String> map = getAll();
        return map.getOrDefault(key, defaultValue);
    }

    /**
     * 从变量表中移除一个值
     * @param key 名
     * @return 被移除的值
     */
    public static String removeFromThreadLocal(String key) {
        Map<String, String> map = getAll();
        String value = map.remove(key);
        update(map);
        return value;
    }

    /**
     * 清空变量表
     */
    public static void clearThreadLocal() {
        LOCAL.remove();
    }

    /**
     * 获取整个变量表
     * @return 值集合
     */
    public static Map<String, String> getAllFromThreadLocal() {
        return getAll();
    }

    /**
     * @return 值集合
     */
    private static Map<String, String> getAll() {
        Map<String, String> map = LOCAL.get();
        if (map == null) {
            map = new HashMap<>(8);
        }
        return map;
    }

    /**
     * 更新变量表
     * @param map 值集合
     */
    private static void update(Map<String, String> map) {
        LOCAL.set(map);
    }

}
